package day230511;

import java.util.Scanner;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * @date 2023/5/11 16:24
 * 发邮件
 */
public class Main01 {

    public static void main(String[] args) {
        long[] dp = new long[21]; // 输入数据的范围最大为20, dp[1]表示1封邮件放错的可能数
        dp[0] = 0L;
        dp[1] = 0L;
        dp[2] = 1L;
        dp[3] = 2L;
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            int n = scan.nextInt();
            // 错排问题
            // 假设有 n 张牌, a b c d ..., a 错放 b
            // b 错放 a, 则可能性有 dp[n-2], 即 n-2 张牌放错的可能数
            // b 错放除了a 的其他信封, 则可能性有 dp[n-1]
            // a 可能错放的信封有 n-1 封
            // 总数为 (n-1) * (dp[n-2] + dp[n-1])
            for (int i = 4; i <= n; i++) {
                dp[i] = (i-1) * (dp[i-2] + dp[i-1]);
            }
            System.out.println(dp[n]);
        }
        scan.close();
    }
}
